package InnerClass;

/**
 * @description:
 * @Author yyp
 * @time
 */
public class AnonymousInnerClass {
    public static void main(String[] args) {
        AnonymousInnerClass01 a = new AnonymousInnerClass01();
//        a.method();
//        a.method();
//        a.method2();
        a.method3();
    }
}

class AnonymousInnerClass01{
    private int n1 = 1;
    public void method(){
        /**
         * 基于接口的匿名内部类
         * 1.需求：想使用接口并创建对象
         * 2.传统方式，是写一个类，实现该接口，并创建对象
         * 3.需求，实现接口的类只使用一次，之后再也不适用了
         * 4.可以使用匿名内部类来简化
         * 5.tiger的编译类型是什么？IA，编译看左边
         * 6.tiger的运行类型是什么？就是匿名内部类,是外部类名称+”$1“,再有一个匿名内部类就+”$2“,以此类推
         * 7.jdk底层创建匿名内部类的实例，并且把地址返回给tiger
         * 8.匿名内部类的创建只有一次，之后只有给匿名内部类创建出的 对象 能够被保留
         */
        final AnonymousInnerClassA tiger = new AnonymousInnerClassA() {
            @Override
            public void cry() {
                System.out.println("老虎叫");
            }
        };
        System.out.println(tiger.getClass());
    }
    public void method2(){
        final AnonymousInnerClassA tiger = new AnonymousInnerClassA() {
            @Override
            public void cry() {
            }
        };
        System.out.println(tiger.getClass());
    }
    public void method3(){
        /**
         * 演示基于类的弥明内部类
         * 1.father编译类型 Father
         * 2.father运行类型 外部类+$3
         */
        AnonymousInnerClassFather father = new AnonymousInnerClassFather("jack"){
            @Override
            public void test(){
                System.out.println("匿名内部类重写了test方法");
            }
        };
        System.out.println("father对象的运行类型="+father.getClass());
        father.test();
    }
}
interface AnonymousInnerClassA{
    public void cry();
}
class AnonymousInnerClassFather{
    public AnonymousInnerClassFather(String name){
    }
    public void test(){
    }
}

